﻿namespace PropOnline.Controllers
{
    using System.Collections.Generic;
    using System.Linq;
    using System.Web.Mvc;
    using PropOnline.Helpers;
    using PropOnline.Models;
    using PropOnline.Stores;    
    using PropOnline.ViewModels.Propiedad;
    using PropOnline.ViewModels.Shared;
    using PropOnline.ViewModels.Produccion;

    [Authorize]
    public class ProduccionController : BusquedaBaseController<BusquedaProduccionViewModel, ResultadoProduccionViewModel>
    {
        protected override BusquedaProduccionViewModel CompleteBusquedaViewModel(BusquedaProduccionViewModel busquedaViewModel)
        {
            busquedaViewModel.BarriosOptions = BusquedaHelper.FillBarriosOptions(busquedaViewModel.BarriosOptions);

            return busquedaViewModel;
        }

        protected override ResultadoProduccionViewModel GetResultadoViewModel(BusquedaProduccionViewModel busquedaViewModel)
        {
            return new ResultadoProduccionViewModel
            {
                BusquedaViewModel = busquedaViewModel,
                BusquedaCurrentUrl = Url.Action(null, BusquedaHelper.GetBusquedaRouteValues(busquedaViewModel)),
            };
        }

        protected override ResultadoPropiedadesViewModel GetResultadoPropiedadesViewModel(BusquedaProduccionViewModel busquedaViewModel)
        {
            if (!busquedaViewModel.CantidadResultados.HasValue)
            {
                busquedaViewModel.CantidadResultados = 0;
            } 

            return new ResultadoPropiedadesViewModel
            {
                Propiedades = this.BuscarProduccion(busquedaViewModel),
                RetryBusquedaUrl = Url.Action("Buscar", BusquedaHelper.GetBusquedaRouteValues(busquedaViewModel)),
                CantidadResultadosSiguientes = busquedaViewModel.CantidadResultados + PropOnlineConstants.DefaultPageSize,
                PagingEnabled = true
            };                           
        }

        private IEnumerable<PropiedadResultadoViewModel> BuscarProduccion(BusquedaProduccionViewModel busquedaViewModel)
        {     
            if (busquedaViewModel.TipoBusqueda == (int)TipoBusqueda.Calle)
            {
                return new PropiedadStore().BuscarPorCalle(busquedaViewModel.Calle, busquedaViewModel.AlturaMin, 
                        busquedaViewModel.AlturaMax, busquedaViewModel.Ambientes, busquedaViewModel.MesesEnMercado, 
                        busquedaViewModel.PrecioMin, busquedaViewModel.PrecioMax, busquedaViewModel.Moneda, 
                        busquedaViewModel.Superficie, busquedaViewModel.TipoPropiedad, busquedaViewModel.ZonaId, 
                        busquedaViewModel.Operacion, null, busquedaViewModel.NombreTelefono, busquedaViewModel.CantidadResultados.Value);
            }
            else
            {
                int[] barrios = new int[0];
                if (busquedaViewModel.BarriosOptions != null)
                {
                    barrios = busquedaViewModel.BarriosOptions.
                            Where(b => b.IsChecked).
                            Union(
                                busquedaViewModel.BarriosOptions.SelectMany(b => b.Hijos.Where(h => h.IsChecked))).
                            Select(b => b.Id).ToArray();                                      
                }

                return new PropiedadStore().BuscarPorBarrios(barrios, busquedaViewModel.Ambientes, 
                    busquedaViewModel.MesesEnMercado, busquedaViewModel.PrecioMin, busquedaViewModel.PrecioMax, 
                    busquedaViewModel.Moneda, busquedaViewModel.Superficie, busquedaViewModel.TipoPropiedad,
                    busquedaViewModel.ZonaId, busquedaViewModel.Operacion, null, busquedaViewModel.NombreTelefono, busquedaViewModel.CantidadResultados.Value);
            }            
        } 
    }
}
